/*
 * EngranajeFisico.cpp
 *
 *  Created on: 13/10/2013
 *      Author: Juliansci
 */

#include "EngranajeFisica.h"
#include <iostream>

using namespace std;

EngranajeFisica::EngranajeFisica(b2World* world, float x, float y, float ancho, float alto, string tipo) : EntidadFisica(tipo) {
	this->definicionCuerpoFisico->position.Set(x, y);
	this->definicionCuerpoFisico->type =  b2_dynamicBody;
	this->cuerpoFisico = world->CreateBody(definicionCuerpoFisico);

	//creo la forma de la pelota mediante un shape
	b2CircleShape* circulo = new b2CircleShape();

	circulo->m_radius = ancho/2 ;

	//definiciones Fisicas del engranaje

	this->fixture = new b2FixtureDef();
	this->fixture->shape = circulo;
	this->fixture->density = 3.5f;

	this->fixture->isSensor = true; //hago q el engranaje este en segundo plano #1
	this->cuerpoFisico->CreateFixture(this->fixture);

	//hay que crear un cuadradito fijo para q el balancin rote sobre el

	b2BodyDef* defBodyCuadradito = new b2BodyDef();

	defBodyCuadradito->position.Set(x, y);
	this->amarre = world->CreateBody(defBodyCuadradito);

	b2PolygonShape* formaCuadradito= new b2PolygonShape();
	formaCuadradito->SetAsBox(0.5f, 0.5f);
	b2FixtureDef* fixtureAmarre = new b2FixtureDef();
	fixtureAmarre->shape = formaCuadradito;
	fixtureAmarre->density = 0.0f;
	fixtureAmarre->isSensor = true;  //hago que el engranaje este en segundo plano #2
	this->amarre->CreateFixture(fixtureAmarre);


	this->jd = new b2RevoluteJointDef();
	this->jd->Initialize(this->amarre, this->cuerpoFisico, this->cuerpoFisico->GetPosition());//this->cuerpoFisico->GetPosition());
	cout<<"jointeo engranaje"<<endl;
	jd->collideConnected = true;
	//jd->enableMotor=true;
	this->joint = world->CreateJoint(jd);


	this->guardarInformacionDeEntidad();
	this->alto = alto;
	this->ancho = ancho;

}

b2Body* EngranajeFisica::getAmarre(){
	return this->amarre;
}

b2Joint* EngranajeFisica::getJoint(){
	return (this->joint);
}

b2RevoluteJointDef* EngranajeFisica::getRevoluteJointDef(){
	return this->jd;
}

void EngranajeFisica::setNuevaJoint(b2Joint* jointNueva){
	this->joint = jointNueva;
}


EngranajeFisica::~EngranajeFisica() {
	// TODO Auto-generated destructor stub
}


void EngranajeFisica::agregarEngranajeAConectar(EntidadFisica* engranaje){
	this->listaEngranajesConectados.push_back(engranaje);
}

void EngranajeFisica::jointear(b2World* world){

	cout << "jointeando engranaje fisica " << endl;
	list<EntidadFisica*>::iterator itFisica = this->listaEngranajesConectados.begin();

	while(itFisica != this->listaEngranajesConectados.end()){
		EngranajeFisica* engranajeFisica1 = (EngranajeFisica*)(*itFisica);

		b2Body* body1 = engranajeFisica1->obtenerCuerpo();
		b2Body* body2 = this->obtenerCuerpo();

		b2GearJointDef* gearJointDef1 = new b2GearJointDef();

		gearJointDef1->bodyA = body1;
		gearJointDef1->bodyB = body2;
		gearJointDef1->joint1 = engranajeFisica1->getJoint();
		gearJointDef1->joint2 = this->getJoint();
		float radio1 = engranajeFisica1->obtenerFixture()->shape->m_radius;
		float radio2 = this->obtenerFixture()->shape->m_radius;
		cout<<"RADIO 1:"<<radio1<<endl;
		cout<<"RADIO 2:"<<radio2<<endl;
		gearJointDef1->ratio = radio2/radio1;

		cout<<"RATIO: "<<gearJointDef1->ratio<<endl;

		world->CreateJoint(gearJointDef1);
		itFisica++;
	}
}

